Demandez le programme !

Les algorithmes gloutons dans la section Algorithmique.

Introduction à l'algorithme glouton

Dans ce chapitre nous allons aborder la notion d'optimisation d'un problème.

Un problème d'optimisation est un problème pour lequel on cherche la meilleure solution (selon un critère défini) dans un ensemble de solutions possibles.

Quelques exemples de problèmes d'optimisation :

On parle de solution optimale toute une solution qui fait partie des solutions possibles et qui est la meilleure des solutions selon le critère défini.

Les algorithmes gloutons sont souvent utilisés pour résoudre ces problèmes d'optimisation . On cherche une solution optimale en effectuant le meilleur choix possible à chaque étape de l'algorithme. Dans ce type de résolution, il n'y a pas de retour en arrière. Lorsqu'un choix est fait, il n'est pas modifié par la suite. On se retrouve donc à chaque étape, avec un problème de plus en plus petit à résoudre.

Attention toutefois, cette méthode ne fournit pas systématiquement la solution optimale au problème proposé.

Exemple classique : le rendu de monnaie.

Nous allons étudier un problème d'optimisation classique : le problème du rendu de monnaie de manière optimale. On cherche à rendre la monnaie avec un nombre minimal de pièces et billets.

On cherche par exemple à rendre $53$ euros. On peut dans un tableau énumérer quelques solutions possibles et choisir celle qui minimise le nombre de pièces et de billets.

Rendus de monnaie Nombre de pièces et de billets
$5300 \times 0,01 €$ 5 300
$53 \times 1 €$ 53
$5 \times 10 + 1 \times 2 + 1 \times 1 €$ 7
$ 2 \times 20 + 3 \times 5 + 1 \times 2 € $ 6
$ 1 \times 50 + 1 \times 1 + 1 \times 2 € $ 3

L'utilisation de ce type de méthode est très coûteux en temps de calcul car il faut explorer toutes les possibilités avant de trouver la solution optimale.

Présentation en vidéo.

L'algorithme glouton

Un algorithme glouton est un algorithme dans lequel on procède étape par étape en faisant, à chaque étape, le meilleur choix possible.
On ne remet jamais en cause les choix faits aux étapes passées.

Dans notre cas nous allons rendre la monnaie en commençant par la pièce ou le billet avec la plus grande valeur possible (en restant inférieur à la somme à rendre). Cela correspond à notre dernière ligne de tableau ($ 1 \times 50 + 1 \times 1 + 1 \times 2 € $). On recommence ainsi jusqu'à obtenir une valeur nulle.

On note :

Algorithme glouton de rendu de monnaie :
  1. initialiser monnaie à une liste vide
  2. initialiser la somme_restante à somme
  3. tant que somme_restante >0 :
    • On choisit la plus grande valeur dans systeme inférieure à somme_restante
    • on ajoute cette valeur à monnaie
    • on retire cette valeur à somme_restante
  4. renvoyer monnaie

Reprenons notre exemple avec somme=$53$ et systeme=$[0.01,0.02,0.05,0.1,0.2,1,2,5,10,20,50]$.

Voici la liste des étapes :

Étapes liste des monnaies rendues somme restant à rendre
Initialisation monnaie=[] somme_restante=$53$
Etape 1 monnaie = $[50]$ somme_restante=$3$
Etape 2 monnaie = $[50,2]$ somme_restante=$1$
Etape 2 monnaie = $[50,2,1]$ somme_restante=$0$

Notre solution dépend du nombre de pièces et de billets disponibles. Si nous sommes limités sur certaines pièces et/ou certains billets, les résultats seront différents.

  1. Traiter comme précédemment le rendu de monnaie dans le cas d'un système S = $[1,2,5,50,100]$ et d'une somme : $ 27 €.$

  2. Comment gérer le rendu de monnaie dans le cas d'un système S = $[1,2,5,50,100]$ et d'une somme : $ 27 €$ dans le cas où l'on ne dispose que de quatre pièces de chaque type ?

Code de déblocage de la correction :

Quelles sont les préconditions et les postconditions de cet algorithme ?

Code de déblocage de la correction :

Solution et solution optimale

On peut se poser la question pourquoi notre système monétaire ne possède pas de pièces ou de billets de 7 € ?
L'exercice suivant va vous permettre de mieux comprendre cela.

On considère le cas dans cet exercice du système S = $[1,2,5,7,10,20]$ et d'une somme : $ 14 €$.

  1. Déterminer les pièces et billets rendus dans le cas de l'utilisation de l'algorithme glouton.

  2. Quelles pièces ou billets suffit-il de rendre pour rendre 14€ ?

  3. L'algorithme glouton donne-t-il toujours une solution optimale ?

Code de déblocage de la correction :

Il existe des conditions sur le système pour que l'algorithme glouton soit optimal. Si le sujet vous intéresse, vous pouvez faire des recherches ou consulter cette partie de page Wikipedia.

Dans le système de pièces de la Zone Euro, l'algorithme glouton donne toujours une solution optimale.

Avant la décimalisation définitive de 1971, le système monétaire britannique reposé sur une subdivision de valeurs qui remontait à l'époque carolingienne.

Voici les principales valeurs de cet ancien système, appelé système impérial :

(source : wikipedia)

  1. Quel sera le rendu de monnaie de 48 pences avec le système imperial $[240,60,30,24,12,6,3,1]$ dans le cas où on utilise l'algorithme glouton ?

  2. Pouvez-vous trouver une solution plus optimale que celle obtenue par l'algorithme glouton ?

Code de déblocage de la correction :

On considère désormais le système suivant : S=[2,5,10,20,50,100] et la somme à rendre de $21€$.

  1. Proposez une trace d'exécution de l'algorithme glouton sur ce système et cette valeur à rendre.

  2. Que remarquez-vous ?

  3. Pouvez-vous trouver une solution (optimale ?) à ce problème de rendu de monnaie ?

Code de déblocage de la correction :

Un algorithme glouton consiste à effectuer des choix "locaux" (dans le cas du rendu de monnaie : rendre la plus grande valeur possible), choix qui ne seront plus jamais remis en cause mais qui permettent de réduire le problème à un problème plus "simple" (dans le cas du rendu de monnaie : rendre la somme diminuée de la valeur maximale)

Les algorithmes gloutons constituent une méthode algorithmique, parmi d'autres, pour résoudre des problèmes, en particulier d'optimisation.

Lorsqu'un algorithme glouton permet d'obtenir une solution, celle-ci n'est pas forcément la solution optimale au problème.

Un algorithme glouton peut ne trouver aucune solution bien que des solutions existent.

Nous verrons en terminale une méthode pour créer un algorithme, pas trop coûteux, qui permet d'obtenir la solution optimale à coup sûr.

Voici une vidéo qui reprend les limites de l'algorithme glouton dans le cas du rendu de monnaie au travers des exercices précédents :

Implémentation de l'algorithme glouton

  1. Programmer l'algorithme glouton de rendu de monnaie en langage python.
    Pour cela, programmer une fonction rendu_monnaie_glouton qui possède comme paramètres

    • un système de pièces et de billet systeme sous forme de liste de nombres ;

    • une somme à rendre somme.

    Cette fonction renvoie une liste de nombres qui caractérise la monnaie à rendre.

    • penser à trier par ordre décroissant la liste des pièces et billets.

    • Vous pouvez prendre comme jeu de test de l'exemple de présentation.

  2. Améliorer cette fonction pour prendre en compte le fait que l'algorithme ne trouve pas de solution dans certains cas.

    prendre certains exemples du chapitre 1.3 pour tester cette version améliorée.

Code de déblocage de la correction :

Des vidéos pour vous aider à comprendre.

Problème du sac à dos

Pour partir en randonnée, vous disposez d'un sac à dos. Afin de pouvoir marcher longtemps chaque jour, vous décidez de limiter la masse totale transportée à 17kg. Cette limitation ne vous permet pas de pouvoir transporter tous les éléments que vous aimeriez emporter.
Vous décidez de donner une note "utilité" à chacun des objets.

Objet eau nourriture nécessaire de cuisine couverture matelas tente gaz lampe console de jeu change jumelle cartes pull machette livre de chevet
Masse 3 4.3 2.2 1 1.5 3.4 0.8 0.5 2.1 2.8 1.3 0.5 0.8 2.4 0.3
Utilité 20 15 12 6 4 18 13 10 7 11 9 8 8 5 2

Vous cherchez à maximiser l'utilité totale des objets emportés dans votre sac à dos.

Sans ordinateur

  1. Le fait de prendre ou non chaque objet est un choix binaire.
    Si vous voulez tester toutes les possibilités pour remplir votre sac à dos afin de trouver la ou les solutions optimales, combien de cas devez-vous etudier ?

  2. Si vous utilisez un algorithme glouton avec comme critère l'optimisation de l'utilité, quelle sera la composition de votre sac à dos ?

Avec ordinateur

N'étant pas certain.e.s de la pertinence du résultat obtenu, vous décidez de choisir les objets non plus en fonction de leur seule utilité mais en fonction de leur utilité massique c'est-à-dire en fonction du rapport $\frac{utilité}{masse}$.
De plus, plutôt que de tout recalculer à la main, vous préférez utiliser une programme informatique en langage Python.

L'ensemble des objets pouvant être choisis pour la randonnée est implémentée par une liste de dictionnaires, chaque dictionnaire ayant pour clé le nom Nom de l'objet, la masse Masse et l'utilité Utilite.
Voici un fichier donnant cette liste.

  1. Compléter chaque dictionnaire de la liste en rajoutant une clé Utilite_massique qui a pour valeur l'utilité massique de l'objet considéré.

  2. Quel prétraitement sur la liste de dictionnaires est-il pertinent d'effectuer afin de pouvoir écrire un algorithme glouton renvoyant un résultat selon le critère pris en compte ?

  3. Proposer une implémentation en langue Python de l'algorithme glouton permettant de remplir le sac à dos suivant le critère choisi.

  4. Qu'allez-vous emmener en randonnée ?

Code de déblocage de la correction :

QCM

Questions issues de la Banque Nationale de Sujets

Propriétaire des ressources ci-dessous : ministère de l'Éducation nationale et de la jeunesse, licence CC BY SA NC

Voici une sélection de questions issues de la banque nationale de sujets, répondez à ces questions (attention, cette sélection n'est pas exhaustive).

À quelle catégorie appartient l’algorithme classique de rendu de monnaie ?

Réponses :

A- Les algorithmes de classification et d'apprentissage.

B- Les algorithmes de tri.

C- Les algorithmes gloutons.

D- Les algorithmes de mariage stable.

Code de déblocage de la correction :

On dispose en quantité illimité de pièces de 1 euro, 2 euros et 5 euros. On veut totaliser une somme de 18 euros.
Quelle est la solution donnée par l’algorithme glouton ?

Réponses :

A- [5, 5, 5, 2, 1].

B- [5, 5, 5, 2, 2, 1].

C- [5, 5, 2, 2, 2, 1, 1].

D- [5, 2, 2, 2, 2, 1, 1, 1, 1, 1].

Code de déblocage de la correction :

On dispose de sacs de jetons portant les nombres 10, 5, 3 et 1.
On veut obtenir un total de 21 en utilisant ces jetons.
Si on utilise le principe de l'algorithme glouton, quelle addition va-t-on réaliser pour obtenir ce total de 21 ?

Réponses :

A- 5 + 5 + 5 + 5 + 1.

B- 10 + 5 + 3 + 3.

C- 10 + 5 + 5 + 1.

D- 10 + 10 + 1.

Code de déblocage de la correction :

Autres QCM

Les QCM suivants sont des QCM modifiés à partir de QCM se trouvant sur le site https://genumsi.inria.fr.

Parmi les phrases suivantes, laquelle est vraie ?

Réponses :

A- Un algorithme glouton fournit toujours une solution optimale.

B- Un algorithme glouton est généralement moins coûteux en temps que d'autres méthodes d’optimisation.

C- Un algorithme glouton étudie tous les cas possibles pour déterminer la solution optimale.

D- Un algorithme glouton peut revenir en arrière en cas de blocage.

Code de déblocage de la correction :

Un sherpa doit traverser la montagne pour vendre des marchandises dans le village voisin. Il ne peut transporter plus de 20kg dans son sac à dos et il dispose de 6 objets de poids différents et de valeurs différentes.
Voici cette liste d'objets sous forme d'un dictionnaire dont les clés sont le nom de l'objet nom, la valeur en euros valeur, et la masse en kg masse.

Objets=[{nom:"A", valeur:10, masse:8},{nom:"B", valeur:8, masse:12},
        {nom:"C", valeur:5, masse:3},{nom:"D", valeur:9, masse:6},
        {nom:"E", valeur:7, masse:5},{nom:"F", valeur:6, masse:2}]       

Il se demande quels objets choisir pour transporter la valeur totale maximale dans son sac tout en ne dépassant pas 20 kg.
Quels objets doit-il mettre dans son sac s'il applique un algorithme glouton dans la résolution de ce problème ?

Réponses :

A- Objet "B" puis objet "A"

B- Objet "A" puis objet "D" puis objet "E"

C- Objet "C" puis objet "D" puis objet "E" puis objet "F"

D- Objet "B" puis objet "E" puis objet "C"

Code de déblocage de la correction :

Un commerçant vit dans un pays dont le système monétaire est constitué de pièces et de billets ayant pour valeur faciale : 1, 2, 5, 10, 20, 50, 100, 200 et 500. On note euros la liste des valeurs faciales disponibles pour un rendu de monnaie par le commerçant. (le commerçant peut posséder plusieurs pièces ou billets de même valeur)

euros = [1, 1, 1, 1, 1, 2, 2, 2, 5, 10, 10, 10, 20, 50, 100, 100, 100, 200, 500] 

On souhaite écrire un programme qui affiche la monnaie que le commerçant devra rendre.
On note s la somme à rendre en supposant que celle-ci est inférieure ou égale à 1000.
Parmi les 4 programmes suivants, lequel est correct ?

Réponses :

A-

def monnaie(s) :	    	
    i = len(euros)       		
    p = 0                     		
    while s > 0 :
        if s >= euros[i] :    		
            p +=1   	
            s -= euros[i]     	
        else :
            i = i - 1
    return p

B-

def monnaie(s) :	    	
    i = len(euros) - 1        		
    p = 0                     		
    while s > 0 :
        if s >= euros[i] :    		
            p +=1   	
            s -= euros[i]     	
        else :
            i = i - 1
    return p

C-

def monnaie(s) :	    	
    i = len(euros) - 1        		
    p = 0                     		
    while s >= 0 :
        if s >= euros[i] :    		
            p +=1   	
            s -= euros[i]     	
        else :
            i = i - 1
    return p

D-

def monnaie(s) :	    	
    i = len(euros) - 1        		
    p = 0                     		
    while s > 0 :
        if s > euros[i] :    		
            p +=1   	
            s -= euros[i]     	
        else :
            i = i - 1
    return p

Code de déblocage de la correction :

On dispose de sacs de jetons portant les nombres 10, 8, 5 et 1.
On veut obtenir un total de 24 en utilisant ces jetons.
Si on utilise le principe de l'algorithme glouton, quelle addition va-t-on réaliser pour obtenir ce total de 24 ?

Réponses :

A- 8+8+8

B- 10+8+5+1

C- 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1

D- 10+10+1+1+1+1

Code de déblocage de la correction :

Un système monétaire contient les pièces suivantes : 24, 15, 8, 5 et 2 unités. Le nombre de pièces de chaque sorte n'est pas limité.
On souhaite rendre 40 unités.
Quelle est la solution donnée par l'algorithme glouton de rendu de monnaie ?

Réponses :

A- [15, 15, 5, 5]

B- [24, 8, 8]

C- [15, 15, 8, 2]

D- L'algorithme échouera à rendre la somme de 40 unités.

Code de déblocage de la correction :

Voici un arbre, on le parcourt en partant du haut (la racine) et en descendant de branche en branche (les noeuds) jusqu'à arriver à une feuille.
Par exemple on peut faire le parcours Racine 4 puis noeud 5 puis noeud 4 puis feuille 6.
Considérons un algorithme Glouton de parcours (racine vers feuille) de cet arbre, Sélectionnant le noeud le plus grand à chaque étape.


Quel chemin cet algorithme Glouton va-t-il parcourir ?

Réponses :

A- 4-->5-->4-->9

B- 4-->7-->2-->10

C- 4-->7-->3

D- 4-->5-->8

Code de déblocage de la correction :

Parmi les affirmations suivantes, laquelle décrit correctement un algorithme glouton pour rendre la monnaie ?

Réponses :

A- L'algorithme essaie toutes les combinaisons possibles afin d'utiliser le nombre de pièces minimal quel que soit le système de monnaie.

B- L'algorithme rend la monnaie en utilisant la plus grande pièce possible et en n'utilisant chaque valeur de pièces qu'une seule fois.

C- L'algorithme rend la monnaie en utilisant la plus grande pièce possible et en utilisant le nombre de pièces minimal quel que soit le système de monnaie.

D- L'algorithme rend la monnaie en utilisant la plus grande pièce possible et en utilisant le nombre de pièces minimal pour le système de monnaie européen, mais pas forcément pour d'autres systèmes.

Code de déblocage de la correction :

On considère le problème où l’on doit rendre 10 euros de monnaie.
On dispose de pièces de 1,5,8 euros.
Indiquer le rendu de monnaie donné par un algorithme glouton.

Réponses :

A- 5 ; 5

B- 8 ; 1 ; 1

C- 5 ; 1 ; 1 ; 1 ; 1 ; 1

D- L'algorithme glouton échouera à rendre la somme de 10 euros.

Code de déblocage de la correction :

Générateur aléatoire de questions sur les réseaux

Il faut actualiser la page pour changer de question. Propriétaire de la ressource : le site GeNumsi en licence CC BY_NC-SA

Savoirs et savoir-faire

  1. la notion d'algorithme glouton,

  2. qu'un algorithme glouton ne renvoie par forcément la solution optimale à un problème donné.

  1. résoudre un problème grâce à un algorithme glouton,

  2. implémenter un algorithme glouton donné,

  3. améliorer un algorithme glouton donné.

Sitographie/Bibliographie

  • NSI 1re générale (Numérique et sciences informatiques) - Prépabac, nouveau programme de Première (2020-2021) – Céline Adobet, Guillaume Connan, Gérard Rozsavolgyi, Laurent Signac Lien vers le manuel de chez Hatier
  • Licence Creative Commons
    Les différents auteurs mettent l'ensemble du site à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International